﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

//数据库操作帮助类
namespace DAL
{
    public class DBHelper
    {
        //定义这个类要使用的全局变量
        private static string constr;
        private static SqlConnection conn;
        private static SqlCommand cmd;
        private static SqlDataReader dr;
        private static SqlDataAdapter adapter;

        //数据库连接属性，连接配置文件的字符串为"connectionString"
        public static SqlConnection MyConnection
        {
            get
            {
                //必须添加引用System.configuartion
                constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
                //.Net默认打开数据库连接池
                conn = new SqlConnection(constr);
                conn.Open();
                return conn;
            }
        }

        //// 先做几个处理 ,该类实现了IDisposable接口，自动调用非托管堆中释放资源
        //public void Dispose()
        //{
        //    Close();
        //    cmd.Dispose();
        //    dr.Dispose();
        //    conn.Dispose();
        //}

        //取消Command执行，并关闭DataReader对象和数据连接
        public void Close()
        {
            cmd.Cancel();
            if (!dr.IsClosed)
                dr.Close();
            if (conn.State != ConnectionState.Closed)
                conn.Close();
        }

        //创建一个 SQL 参数，主要实现SqlParameter[] 参数列表
        //parameterName参数名
        //dbType类型
        //value值
        public static SqlParameter CreateParameter(string parameterName, SqlDbType dbType, object value)
        {
            SqlParameter result = new SqlParameter(parameterName, dbType);
            result.Value = value;
            return result;
        }

        //主要用于（增加，删除，修改）,返回受影响的行数
        //cmdTxt带参数列表的sql语句
        //pars要传入的参数列表
        public static int GetExcuteNonQuery(string cmdTxt, params SqlParameter[] pars)
        {
            using (cmd = new SqlCommand(cmdTxt, MyConnection))
            {
                if (pars != null)
                    cmd.Parameters.AddRange(pars);
                return cmd.ExecuteNonQuery();
            }
        }

        //执行查询，并返回查询所返回的结果集中第一行的第一列
        public static T ExecuteScalar<T>(string cmdText, params SqlParameter[] pars)
        {
            using (SqlCommand cmd = new SqlCommand(cmdText, MyConnection))
            {
                if (pars != null)
                    cmd.Parameters.AddRange(pars);
                object o = cmd.ExecuteScalar();
                conn.Close();
                return (T)o;
            }
        }

        //将 cmdText 发送到 System.Data.SqlClient.SqlCommand.Connection，并使用 System.Data.CommandBehavior 值之一生成一个 DataReader
        public static SqlDataReader GetDataReader(string cmdTxt, params SqlParameter[] pars)
        {
            using (cmd = new SqlCommand(cmdTxt, MyConnection))
            {
                if (pars != null)
                    cmd.Parameters.AddRange(pars);
                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return dr;
            }
        }

        //做数据绑定显示作用，一般绑定的是数据查看控件
        public static DataTable GetFillData(string cmdTxt, params SqlParameter[] pars)
        {
            DataSet ds = new DataSet();
            using (cmd = new SqlCommand(cmdTxt, MyConnection))
            {
                if (pars != null)
                    cmd.Parameters.AddRange(pars);
                using (adapter = new SqlDataAdapter(cmd))
                {
                    adapter.Fill(ds);
                    return ds.Tables[0];
                }
            }
        }
    }
}
